package email //业务模块

import (
	"fmt"
	"shi_project/main/authentication"
	"shi_project/main/database"
	"sync"

	"github.com/gin-gonic/gin"
	"gopkg.in/gomail.v2"
)

var wg sync.WaitGroup

// 邮件消息结构体
type EmailMessage struct {
	To      string `json:"to"`
	Subject string `json:"subject"`
	Body    string `json:"body"`
}

// 使用 QQ 邮箱发送邮件
func sendEmail(pipe chan *database.User) {
	defer wg.Done()
	email := EmailMessage{
		Subject: "测试邮件",
		Body: `这是一封测试邮件
		前端工程师:师启明
		联系方式:13693617315(同微信)
		作品地址:
		https://shiqiming.cn`,
	}
	// 发送邮件
	for v := range pipe {
		// 创建邮件消息
		m := gomail.NewMessage()
		m.SetHeader("From", "404838153@qq.com") // 发送邮箱地址（QQ邮箱）
		m.SetHeader("To", v.Email)              // 收件人
		m.SetHeader("Subject", email.Subject)   // 邮件主题
		m.SetBody("text/plain", email.Body)     // 邮件内容
		// QQ邮箱的SMTP配置
		d := gomail.NewDialer("smtp.qq.com", 465, "404838153@qq.com", "tqimvjolvgvjbjde")
		err := d.DialAndSend(m)
		if err != nil {
			fmt.Printf("用户:%v 发送失败\n失败原因:%v\n", v.Username, err)
		}
	}
}

func massSendEmail() {
	numGoroutines := 10
	userList, err := database.GetUserList()
	userListChan := make(chan *database.User, len(userList))
	for _, v := range userList {
		userListChan <- v
	}

	close(userListChan)
	if err != nil {
		fmt.Println("获取用户列表失败")
		return
	}

	for i := 0; i < numGoroutines; i++ {
		wg.Add(1)
		go sendEmail(userListChan)
	}
	wg.Wait()
}

func PostEmail(c *gin.Context) {
	if err := authentication.IsPass(c, authentication.MassEmail); err != nil {
		c.JSON(200, gin.H{
			"code": -1,
			"msg":  err,
		})
		return
	}
	massSendEmail()
	c.JSON(200, gin.H{
		"code": 0,
		"msg":  "发送成功",
	})
}
